package main

import (
	"fmt"
	"reflect"
)

//利用一个函数，函数的参数定义为空接口：
func testReflect(i interface{}){	//空接口没有任何方法，所以可以理解为所有类型都实现了空接口，也可以理解为我们把任何一个变量赋值给空接口。
	//1、调用TypeOf函数，返回reflect.Type类型数据：
	refType := reflect.TypeOf(i)
	//2、调用ValueOf函数，返回reflect.Value类型数据：
	refValue := reflect.ValueOf(i)
	fmt.Println("refType：",refType)
	fmt.Printf("refType的具体类型为：%T \n",refType);
	fmt.Println("refValue：",refValue)
	fmt.Printf("refValue的具体类型为：%T \n",refValue);

	// // num1 := 100
	// //如果真想获取reValue的数值，要调用Int()方法来返回int类型的值
	// num2 := 80 + refValue.Int()	//类型不一致
	// fmt.Println(num2)

	//refValue转成空接口
	i2 := refValue.Interface()
	//类型断言：
	s,flag := i2.(Student)
	if flag == true{
		fmt.Printf("学生的名字是：%v\n",s.Name)
		fmt.Printf("学生的年龄是：%v\n",s.Age)
	}
}

//定义学生结构体
type Student struct{
	Name string
	Age int
}

func main(){
	//对结构体类型进行反射：
	//定义结构体具体实例：

	stu := Student{
		Name : "lee",
		Age : 25,
	}

	testReflect(stu)

}